package cn.org.xwb.common.encrypt.aspect;

import cn.org.xwb.common.encrypt.constant.EncryptConstant;
import cn.org.xwb.common.encrypt.utils.DesUtil;
import cn.org.xwb.common.model.vo.RespResult;
import cn.org.xwb.common.utils.AspectUtil;
import cn.org.xwb.common.utils.StringUtil;
import lombok.extern.log4j.Log4j2;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * 和 DES 加密相关的切面
 */
@Aspect
@Order(40)
@Component
@Log4j2
public class DesEnAspect {

    @Pointcut("@annotation(cn.org.xwb.common.encrypt.annotation.des.DesEn)")
    private void pointCut() {
    }

    /**
     * 采用 DES 加密对响应给客户端的数据进行加密，
     * 要加密就必须向响应对象中添加 DES key
     *
     * @param proceedingJoinPoint 切点
     * @return 响应对象
     */
    @Around("pointCut()")
    public Object encodeAroundAdvice(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        // 得到方法响应对象
        RespResult<Object> res = (RespResult<Object>) proceedingJoinPoint.proceed();
        // 准备进行 des 加密
        log.info("方法 {} 处理客户端请求完成，开始对响应数据进行 DES 加密", AspectUtil.getPointMethodSignatureStr(proceedingJoinPoint));
        // 获取 des key
        String desKey = (String) AspectUtil.getPointMethodParamValByName(proceedingJoinPoint, EncryptConstant.DES_KEY_PARAM_NAME);
        // DES 加密
        res.setData(DesUtil.encrypt(StringUtil.obj2JSON(res.getData()), desKey));
        return res;
    }

}
